package com.tw.wechart2.util;

import android.app.Activity;
import android.util.Log;


import com.tw.wechart2.listener.RequestResponseCallback;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.IOException;
import java.security.MessageDigest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;

import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.MediaType;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


/**
 * @Description: ttp请求封装处理
 * @Author: lanteng 2020/9/15
 * @Version: 1.0
 */
public class RequestResponseUtil {

    public String TAG = "RequestResponseUtil";
    public static RequestResponseUtil instance;

    private RequestResponseUtil(){}
    public static RequestResponseUtil getInstance() {
        if (null == instance) {
            synchronized (RequestResponseUtil.class) {
                if (null == instance) {
                    instance = new RequestResponseUtil();
                }
            }
        }
        return instance;
    }
//
//    /**
//     * 获取请求结果对象(根据不同的url返回不同的body对象)，post请求，请求body里为表单
//     * @param data data参数内容
//     * @param url
//     * @return
//     */
//    public void getRequestPost(Activity activity, JSONObject data, String url, int offset, int pageSize, RequestResponseCallback callback)
//    {
//        JSONObject obj = new JSONObject();
//
//        try {
//            obj.put("data", data);
//            obj.put("header", getHeaderJSONObject());
//            obj.put("offset", offset);
//            obj.put("pageSize", pageSize);
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
//
//        OkHttpClient client = OkHttpUtil.getInstance();
//
//        // 表单格式提交数据，body实例化过程
//        FormBody.Builder builder = new FormBody.Builder();
//        builder.add("requestData", obj.toString());
//        MyLogUtils.instance().logI(TAG, "map:" + obj.toString());
//        RequestBody body = builder.build();
//
//        Request request = new Request.Builder()
//                // 设置header头
//                .addHeader("Content-Type","application/x-www-form-urlencoded")
//                .url(url)
//                .post(body)
//                .build();
//
//        RequestBody b = request.body();
//        MyLogUtils.instance().logI("RequestResponseUtil", b.toString());
//
//        // 自定义执行请求函数
//        executeRequest(activity,client, request, callback);
//    }

//    /**
//     * 获取请求结果对象(根据不同的url返回不同的body对象)，post请求，请求body里为表单
//     * @param map 表单参数
//     * @param url
//     * @return
//     */
//    public void getRequestPostOnlyData(Activity activity, Map<Object, Object> map, String url, int offset, int pageSize, RequestResponseCallback callback)
//    {
//        OkHttpClient client = OkHttpUtil.getInstance();
//
//        // 表单格式提交数据，body实例化过程
//        FormBody.Builder builder = new FormBody.Builder();
//        StringBuilder sb = new StringBuilder();
//        for (Object set : map.keySet()) {
//            builder.add(String.valueOf(set), String.valueOf(map.get(set)));
//            sb.append(String.valueOf(set) + ":" + String.valueOf(map.get(set)) + "; ");
//        }
//
//        RequestBody body = builder.build();
//
//        Request request = new Request.Builder()
//                // 设置header头
//                .addHeader("Content-Type","application/x-www-form-urlencoded")
//                .url(url)
//                .post(body)
//                .build();
//
//        RequestBody b = request.body();
//        Log.i("RequestResponseUtil", b.toString());
//
//        // 自定义执行请求函数
//        executeRequest(activity,client, request, callback);
//    }

    /**
     * 获取请求结果对象(根据不同的url返回不同的body对象)，post请求，请求body里为json串 , 此方法中obj直接传递, 不新增其他参数
     * @param activity
     * @param obj
     * @param url
     * @param offset
     * @param pageSize
     * @param callback
     */
    public void getRequestJSONPost(Activity activity, JSONObject obj, String url, int offset, int pageSize, RequestResponseCallback callback)
    {
        OkHttpClient client = OkHttpUtil.getInstance();

        // json格式提交数据，body实例化过程
        MediaType type = MediaType.parse("application/json; charset=utf-8");
        RequestBody body = RequestBody.create(type, obj.toString());
        MyLogUtils.instance().logI(TAG, "map:" + obj.toString());

        Request request = new Request.Builder()
                // 设置header头
                .addHeader("Content-Type","application/x-www-form-urlencoded")
                .url(url)
//                .post(body)
                .build();

//        RequestBody b = request.body();
//        MyLogUtils.instance().logI("RequestResponseUtil", b.toString());

        // 自定义执行请求函数
        executeRequest(activity,client, request, callback);
    }

//    /**
//     * 获取请求结果对象(根据不同的url返回不同的body对象)，post请求，请求body里为json串
//     * @param activity
//     * @param data
//     * @param url
//     * @param offset
//     * @param pageSize
//     * @param callback
//     */
//    public void getRequestJSONPost(Activity activity, JSONObject data, String url, int offset, int pageSize, RequestResponseCallback callback) {
//        JSONObject obj = new JSONObject();
//
//        try {
//            obj.put("data", data);
//            obj.put("header", getHeaderJSONObject());
//            obj.put("offset", offset);
//            obj.put("pageSize", pageSize);
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
//        getRequestJSONPost(activity, obj, url, offset, pageSize, callback);
//    }

//    private JSONObject getHeaderJSONObject() {
//        JSONObject obj = new JSONObject();
//        try {
//            obj.put("deviceCode", SystemUtils.getMac(UmKernel.getInstance().getContext()));
//            obj.put("sign", createSign());
//            obj.put("timestamp", getCurrentDate());
//            obj.put("ver", SystemUtils.getVersionName(UmKernel.getInstance().getContext()));
//        } catch (JSONException e) {
//            e.printStackTrace();
//        }
//        return obj;
//    }

//    private String createSign() {
//        try {
//            MessageDigest digest = MessageDigest.getInstance("MD5");
//            byte[] bytes = digest.digest(this.toString().getBytes());
//            StringBuffer result = new StringBuffer();
//            byte[] var4 = bytes;
//            int var5 = bytes.length;
//
//            for(int var6 = 0; var6 < var5; ++var6) {
//                byte b = var4[var6];
//                String temp = Integer.toHexString(b & 255);
//                if (temp.length() == 1) {
//                    result.append("0");
//                }
//
//                result.append(temp);
//            }
//
//            return result.toString().toLowerCase();
//        } catch (Exception var9) {
//            var9.printStackTrace();
//            return "";
//        }
//    }

    private String getCurrentDate() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }

    /**
     * 执行请求（异步）
     * @param client
     * @param request
     * @return
     */
    private void executeRequest(final Activity activity, OkHttpClient client, final Request request, final RequestResponseCallback callback)
    {
        client.newCall(request).enqueue(new Callback()
        {
            @Override
            public void onFailure(Call call, final IOException e)
            {
                if (null != activity) {
                    activity.runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            callback.onFailure(e.toString());
                        }
                    });
                } else {
                    MyLogUtils.instance().logE(TAG, "数据请求失败, 且activity异常 , activity为null了");
                }
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException
            {
                if (null == activity) {
                    MyLogUtils.instance().logE(TAG, "数据请求成功, 但activity异常 , activity为null了");
                    return;
                }
                final String body = response.body().string();
                activity.runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        callback.onSuccess(body);
                    }
                });
            }

        });
    }
}
